﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CRM_SF_data_import.Crm.Sdk;
using System.IO;
using System.Globalization;
using System.Data.Linq;

namespace CRM_SF_data_import
{
    class Program
    {
        static void Main(string[] args)
        {
            const string LogFileNameBaseDefault = "SF_import";
            int icounter = 0;

            //nastavení inveriantní kultury kvůli jednotným I/O zápisům data a času a parsování string na CrmFloat
            CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;

            //vytvoření logovacího souboru

            //odvození log file name
            DateTime dateSnap = DateTime.Now;
            string logFileName = dateSnap.ToString("yyyy-MM-dd") + "_" + (Properties.Settings.Default.LogFileNameBase ?? LogFileNameBaseDefault) + ".txt";

            //výběr log adresáře
            string logPath = Properties.Settings.Default.LogFilePath ?? Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

            //pokud adresář neexistuje, vytvoříme ho (výjimky neřešíme, předpokládá se dostatečné oprávnění)
            if (!Directory.Exists(logPath))
            {
                Directory.CreateDirectory(logPath);
            }

            //zápis zahájení importu
            using (StreamWriter swr = new StreamWriter(logPath + @"\" + logFileName, true))     //append if exists
            {
                swr.WriteLine(DateTime.Now.ToString(CultureInfo.InvariantCulture) + " SF data import started...");
                swr.WriteLine(new string('-', 45));

                //zpracování dat z SF view
                using (var db = new Scania_Czech_Republic_s_r_o__MSCRMEntitiesSFData())
                {
                    var q = from a in db.SFdata
                            select a;
                    //jen obsahuje-li view nějaká data
                    if (q.Count() > 0)
                    {
                        //vytvoření CRM služby
                        CrmService service = GetCRMService();

                        //deklarace pomocných proměnných pro SF údaje
                        string COUNTRY;
                        string IC;
                        string UROK;
                        string NULTASPL;

                        //WIP
                        foreach (var i in q)
                        {
                            //Console.WriteLine("COUNTRY={0} IC={1} UROK={2} NULTASPL={3}", i.COUNTRY, i.ICO, i.UROK, i.NULTASPL);
                            //konverze na CRM-srozumitelné typy
                            COUNTRY = i.COUNTRY.ToString();
                            switch (COUNTRY)
                            {
                                case "CS":
                                    COUNTRY = "98d99e7a-6674-df11-b244-0019bb369d86";   //GUID Country entity CZ, zatím hardcoded pro prototyp
                                    break;
                                default:
                                    COUNTRY = "";
                                    break;
                            }
                            IC = i.ICO.ToString().Trim();
                            UROK = i.UROK.ToString();
                            NULTASPL = i.NULTASPL.ToString();

                            //atributy k vrácení
                            ColumnSet columns = new ColumnSet();
                            columns.Attributes = new string[] { "name", "accountid", "cea_accountico", "cea_downpayment", "cea_interestrate" };
                            //filtrujeme podle atributů
                            QueryByAttribute query = new QueryByAttribute();
                            query.ColumnSet = columns;
                            //hledáme v entitě Accounts
                            query.EntityName = EntityName.account.ToString();
                            //filtrované atributy
                            query.Attributes = new string[] { "cea_accountico", "statecode", "cea_countryid" };
                            query.Values = new string[] { IC, AccountState.Active.ToString(), COUNTRY };
                            //získání výsledku od webové služby
                            BusinessEntityCollection retrieved = service.RetrieveMultiple(query);
                            //debug tisk
                            Console.WriteLine("Found: {0}", retrieved.BusinessEntities.Count());
                            Console.WriteLine("--- --- ---");
                            //procházení vrácené sady
                            foreach (account retAccount in retrieved.BusinessEntities)
                            {
                                //zápis dat do CRM
                                retAccount.cea_downpayment = new CrmFloat() { Value = double.Parse(NULTASPL) }; //pozor na Culture desetinný oddělovač
                                retAccount.cea_interestrate = new CrmFloat() { Value = double.Parse(UROK) };    //dtto
                                service.Update(retAccount);

                                //výpis na obrazovku
                                Console.WriteLine(icounter.ToString() + '\t' + retAccount.name + '\t' + retAccount.accountid.Value + '\t' + retAccount.cea_accountico + '\t' +
                                    ((retAccount.cea_downpayment == null) ? "NULL" : retAccount.cea_downpayment.Value.ToString()) + '\t' +
                                    ((retAccount.cea_interestrate == null) ? "NULL" : retAccount.cea_interestrate.Value.ToString()));
                                //zápis do log souboru: zpracovávaný záznam
                                swr.WriteLine(icounter.ToString() + '\t' + retAccount.name + '\t' + retAccount.accountid.Value + '\t' + retAccount.cea_accountico + '\t' +
                                    ((retAccount.cea_downpayment == null) ? "NULL" : retAccount.cea_downpayment.Value.ToString()) + '\t' +
                                    ((retAccount.cea_interestrate == null) ? "NULL" : retAccount.cea_interestrate.Value.ToString()));
                            }
                            icounter++;
                        }
                    }
                }
                //zápis do logu: konec importu
                swr.WriteLine(icounter.ToString() + " records processed.");
                swr.WriteLine(DateTime.Now.ToString(CultureInfo.InvariantCulture) + " SF data import ended.");
                swr.WriteLine(new string('-', 45));
            }
    }

        private static CrmService GetCRMService()
        {
            //autentizace a vytvoření CRM služby
            CrmAuthenticationToken token = new CrmAuthenticationToken();
            token.AuthenticationType = 0;   //AD autentizace
            token.OrganizationName = Properties.Settings.Default.CRMOrgName;
            CrmService service = new CrmService();
            service.Url = Properties.Settings.Default.CRM_SF_data_import_Crm_Sdk_CrmService;
            service.CrmAuthenticationTokenValue = token;
            service.Credentials = System.Net.CredentialCache.DefaultCredentials;
            return service;
        }
    }
}
